/************************************************************************
 * Este archivo, representa la interfaz de creaión de un vehiculo
 * junto con las acciones asociadas a los eventos de cada componente
 * 
 * @system: veco-system
 * @description: Sistema de control vehicular
 * @version: 1.0
 * @Copyright © 2013 
 * 
 * @authores:
 * 
 *      > Alberione, Fernando    <falberione_037@gmail.com>
 * 
 *      > Boretto, Martin        <martinboretto@gmail.com>
 * 
 *      > Lenarduzzi, Federico   <fedeatenas@gmail.com>
 * 
 *      > Ocampo, Emanuel        <eocampo86@gmail.com>
 *
 *************************************************************************/
package Interfaces;

import SistemaCocheras.manejadorCliente;
import SistemaCocheras.manejadorVehiculo;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.sql.Connection;
import java.sql.ResultSet;
import javax.swing.JOptionPane;


public class nuevoVehiculo extends javax.swing.JFrame {
    private String marca = "";
    private String modelo = "";
    private String dominio = "";
    private String duenio = "";
    private int tipo = -1;
    private Connection conexion;

    
    // ---------------------------------------------------------
    // ------- Seccion de constructores de la clase
    // ---------------------------------------------------------    

    /**
     * Constructor vacio 
     */
    public nuevoVehiculo() {
        initComponents();
        centrarJFrame();
    }// Fin Constructor

    
    /**
     * Constructor NO vacio
     * @param con Representa la conexion de la base de datos
     */
    public nuevoVehiculo(Connection con) {
        this.conexion = con;
        initComponents();
        centrarJFrame();
    }// Fin Constructor

    
    /**
     * Constructor NO vacio
     * @param con Representa la conexion de la base de datos
     * @param dni Representa el DNI del duenio 
     */ 
    public nuevoVehiculo(Connection con, String dni) {
        this.conexion = con;
        initComponents();
        centrarJFrame();
        this.campoTextoDuenio.setText(dni);
        this.campoTextoDuenio.setEnabled(false);
    }// Fin Constructor

    
    // ---------------------------------------------------------
    // ------- Seccion de metodos publicos 
    // --------------------------------------------------------- 
    
    /**
     * Metodo encargado de levantar una instancia de la clase 
     * @param args 
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new nuevoVehiculo().setVisible(true);
            }
        });
    }// Fin main
    
    
    // ---------------------------------------------------------
    // ------- Seccion de metodos privados 
    // ---------------------------------------------------------    
    
    /**
     * Funcion encargada de centrar el dialogo en la pantalla
     */
    private void centrarJFrame(){
        Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frame =this.getSize();
        this.setLocation((pantalla.width-frame.width)/2, (pantalla.height-frame.height)/2);
    }// Fin centrarJFrame
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        labelMarca = new javax.swing.JLabel();
        labelModelo = new javax.swing.JLabel();
        labelDominio = new javax.swing.JLabel();
        labelDNI = new javax.swing.JLabel();
        botonAceptar = new javax.swing.JButton();
        botonInsertarOtroVehiculo = new javax.swing.JButton();
        botonCancelar = new javax.swing.JButton();
        campoTextoDuenio = new javax.swing.JTextField();
        campoTextoDominio = new javax.swing.JTextField();
        campoTextoModelo = new javax.swing.JTextField();
        campoTextoMarca = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        tiposDeVehiculos = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("B&B - Nuevo vehiculo");
        setResizable(false);

        labelMarca.setText("Marca:");

        labelModelo.setText("Modelo:");

        labelDominio.setText("Dominio (*):");

        labelDNI.setText("DNI del Dueño:");

        botonAceptar.setText("Aceptar");
        botonAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAceptarActionPerformed(evt);
            }
        });

        botonInsertarOtroVehiculo.setText("Insertar otro Vehiculo");
        botonInsertarOtroVehiculo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonInsertarOtroVehiculoActionPerformed(evt);
            }
        });

        botonCancelar.setText("Cancelar");
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        jLabel1.setText("Tipo de Vehiculo:");

        tiposDeVehiculos.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Automovil", "Camioneta", "Motocicleta", "Bicicleta", "Utilitario" }));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE)
                        .addComponent(botonInsertarOtroVehiculo, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(26, 26, 26)
                        .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(labelDNI)
                            .addComponent(labelModelo)
                            .addComponent(labelMarca)
                            .addComponent(labelDominio))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(campoTextoDominio, javax.swing.GroupLayout.DEFAULT_SIZE, 386, Short.MAX_VALUE)
                            .addComponent(campoTextoMarca, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 386, Short.MAX_VALUE)
                            .addComponent(campoTextoModelo, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 386, Short.MAX_VALUE)
                            .addComponent(campoTextoDuenio, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)
                            .addComponent(tiposDeVehiculos, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap())
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {botonAceptar, botonCancelar, botonInsertarOtroVehiculo});

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {campoTextoDominio, campoTextoMarca, campoTextoModelo});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelDominio)
                    .addComponent(campoTextoDominio, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelMarca)
                    .addComponent(campoTextoMarca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(labelModelo))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(12, 12, 12)
                        .addComponent(campoTextoModelo, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelDNI)
                    .addComponent(campoTextoDuenio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(tiposDeVehiculos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 21, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(botonCancelar, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(botonAceptar)
                        .addComponent(botonInsertarOtroVehiculo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addGap(25, 25, 25))
        );

        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {botonAceptar, botonCancelar, botonInsertarOtroVehiculo});

        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {campoTextoDominio, campoTextoDuenio, campoTextoMarca, campoTextoModelo});

        pack();
    }// </editor-fold>//GEN-END:initComponents

    
    /**
     * Metodo encargado de realizar lo necesario (crear vehiculo) a 
     * traves del boton aceptar
     * @param evt Representa el evento del click
     */
    private void botonAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAceptarActionPerformed
        this.marca = this.campoTextoMarca.getText();
        this.modelo = this.campoTextoModelo.getText();
        this.dominio = this.campoTextoDominio.getText().toUpperCase();
        this.duenio = this.campoTextoDuenio.getText();
        this.tipo = this.tiposDeVehiculos.getSelectedIndex();
        manejadorVehiculo mv = new manejadorVehiculo(this.conexion);
        try {
            if (mv.esPatenteValida(this.dominio)){
                ResultSet vehiculo = mv.buscarVehiculoPorDominio(this.dominio);
                //--------------------------------------------------------------
                // INSERCION DE UN CLIENTE FICTICO
                //--------------------------------------------------------------
                if(vehiculo.next()){
                    if (!(this.duenio.equals(""))){
                        manejadorCliente mc = new manejadorCliente(this.conexion);
                        if ((mc.buscarClientePorDni(this.duenio)).next()) {
                            // Si el cliente ya se encuentra cargado, se pregunta por su correspondiente vehiculo
                            if(vehiculo.getString("dni_propietario") == null){
                                mv.insercionFicticiaVehiculo(this.dominio, this.duenio); // Seteamos el campo "dni_propietario" en ""
                                JOptionPane.showMessageDialog(null, "Se ha registrado correctamente el vehiculo del cliente con DNI:\"" + this.duenio + "\".", "B&B - Insercion Satisfactoria", JOptionPane.INFORMATION_MESSAGE);
                                nuevoVehiculo.this.dispose();
                            }
                            else{
                                JOptionPane.showMessageDialog(null, "El vehiculo ya se encuentra registrado ", "B&B - Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                            }
                        }
                        else {
                            // Vehiculo sin cliente, entonces se llama al crear nuevo Cliente
                            JOptionPane.showMessageDialog(null, "El cliente no se encuentra registrado, si quiere proseguir,debe ingresar un nuevo cliente. ", "B&B - Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                            nuevoCliente nc = new nuevoCliente(this.conexion, this.duenio);
                            nc.setVisible(true);
                        }
                    }
                    else{
                        JOptionPane.showMessageDialog(null, "El vehiculo ya se encuentra registrado ", "B&B - Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                    }
                }
                //--------------------------------------------------------------
                // INSERCION DE UN CLIENTE REAL
                //--------------------------------------------------------------
                else{
                    if (!(this.duenio.equals(""))){
                        manejadorCliente mc = new manejadorCliente(this.conexion);
                        if ((mc.buscarClientePorDni(this.duenio)).next()) {
                            mv.insertarVehiculoConCliente(this.dominio, this.marca, this.modelo, this.duenio, this.tipo);
                            JOptionPane.showMessageDialog(null, "Se ha registrado correctamente el vehiculo del cliente con DNI:\"" + this.duenio + "\".", "Insercion Satisfactoria", JOptionPane.INFORMATION_MESSAGE);
                            nuevoVehiculo.this.dispose();
                        } else {
                            JOptionPane.showMessageDialog(null, "El cliente no se encuentra registrado, si quiere proseguir,debe ingresar un nuevo cliente. ", "Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                            nuevoCliente nc = new nuevoCliente(this.conexion, this.duenio);
                            nc.setVisible(true);
                        }
                    }
                    else{
                        mv.insertarVehiculoSinCliente(this.dominio, this.marca, this.modelo, this.tipo);
                        JOptionPane.showMessageDialog(null, "Se ha registrado correctamente el vehiculo de un cliente particular.","Insercion Satisfactoria", JOptionPane.INFORMATION_MESSAGE);
                        nuevoVehiculo.this.dispose();
                    }
                }
            }
            else {
                JOptionPane.showMessageDialog(null, "El formato de la patente es incorrecto. Formato correcto: \"ABC123 \"","Insercion Fallida", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,"Ha ocurrido un error interno: "+ ex, "Sistema de Cocheras B&B",JOptionPane.ERROR_MESSAGE);
        }
}//GEN-LAST:event_botonAceptarActionPerformed

    
    // HACE LO MISMO QUE EL BOTON ACEPTAR!!!!
    private void botonInsertarOtroVehiculoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonInsertarOtroVehiculoActionPerformed
        this.marca = this.campoTextoMarca.getText();
        this.modelo = this.campoTextoModelo.getText();
        this.dominio = this.campoTextoDominio.getText().toUpperCase();
        this.duenio = this.campoTextoDuenio.getText();
        this.tipo = this.tiposDeVehiculos.getSelectedIndex();
        manejadorVehiculo mv = new manejadorVehiculo(this.conexion);
        try {
            if (mv.esPatenteValida(dominio)){
                ResultSet vehiculo = mv.buscarVehiculoPorDominio(this.dominio);
                //--------------------------------------------------------------
                // INSERCION DE UN CLIENTE FICTICO
                //--------------------------------------------------------------
                if(vehiculo.next()){
                    if (!(this.duenio.equals(""))){
                        manejadorCliente mc = new manejadorCliente(this.conexion);
                        if ((mc.buscarClientePorDni(this.duenio)).next()) {
                            // Si el cliente ya se encuentra cargado, se pregunta por su correspondiente vehiculo
                            if(vehiculo.getString("dni_propietario")== null){
                                mv.insercionFicticiaVehiculo(this.dominio, this.duenio); // Seteamos el campo "dni_propietario" en ""
                                JOptionPane.showMessageDialog(null, "Se ha registrado correctamente el vehiculo del cliente con DNI:\"" + this.duenio + "\".", "B&B - Insercion Satisfactoria", JOptionPane.INFORMATION_MESSAGE);
                                reiniciarValores(this.duenio);
                            }
                            else{
                                JOptionPane.showMessageDialog(null, "El vehiculo ya se encuentra registrado ", "B&B - Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                            }
                        }
                        else {
                            // Vehiculo sin cliente, entonces se llama al crear nuevo Cliente
                            JOptionPane.showMessageDialog(null, "El cliente no se encuentra registrado, si quiere proseguir,debe ingresar un nuevo cliente. ", "B&B - Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                            nuevoCliente nc = new nuevoCliente(this.conexion, this.duenio);
                            nc.setVisible(true);
                        }
                    }
                    else{
                        JOptionPane.showMessageDialog(null, "El vehiculo ya se encuentra registrado ", "B&B - Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                    }
                }
                //--------------------------------------------------------------
                // INSERCION DE UN CLIENTE REAL
                //--------------------------------------------------------------
                else{
                    if (!(this.duenio.equals(""))){
                        manejadorCliente mc = new manejadorCliente(this.conexion);
                        if ((mc.buscarClientePorDni(this.duenio)).next()) {
                            mv.insertarVehiculoConCliente(this.dominio, this.marca, this.modelo, this.duenio, this.tipo);
                            JOptionPane.showMessageDialog(null, "Se ha registrado correctamente el vehiculo del cliente con DNI:\"" + this.duenio + "\".", "Insercion Satisfactoria", JOptionPane.INFORMATION_MESSAGE);
                            reiniciarValores(this.duenio);
                        } else {
                            JOptionPane.showMessageDialog(null, "El cliente no se encuentra registrado, si quiere proseguir,debe ingresar un nuevo cliente. ", "Insercion Fallida", JOptionPane.ERROR_MESSAGE);
                            nuevoCliente nc = new nuevoCliente(this.conexion, this.duenio);
                            nc.setVisible(true);
                        }
                    }
                    else{
                        mv.insertarVehiculoSinCliente(this.dominio, this.marca, this.modelo, this.tipo);
                        JOptionPane.showMessageDialog(null, "Se ha registrado correctamente el vehiculo de un cliente particular.","Insercion Satisfactoria", JOptionPane.INFORMATION_MESSAGE);
                        reiniciarValores("");
                    }
                }
            }
            else {
                JOptionPane.showMessageDialog(null, "El formato de la patente es incorrecto. Formato correcto: \"ABC123 \"","Insercion Fallida", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,"Ha ocurrido un error interno: "+ ex, "Sistema de Cocheras B&B",JOptionPane.ERROR_MESSAGE);
        }
        
}//GEN-LAST:event_botonInsertarOtroVehiculoActionPerformed

    
   /**
    * Metodo encargado de limpiar los campos
    */
    private void reiniciarValores(String dni){
        this.campoTextoMarca.setText("");
        this.campoTextoModelo.setText("");
        this.campoTextoDominio.setText("");
        this.campoTextoDuenio.setText(dni);
    }// Fin reiniciarValores
    
    
    /**
     * Metodo encargado de cerrar la interfaz a traves del boton cancelar
     * @param evt Representa el evento del click
     */
    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        nuevoVehiculo.this.dispose();
    }//GEN-LAST:event_botonCancelarActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAceptar;
    private javax.swing.JButton botonCancelar;
    private javax.swing.JButton botonInsertarOtroVehiculo;
    private javax.swing.JTextField campoTextoDominio;
    private javax.swing.JTextField campoTextoDuenio;
    private javax.swing.JTextField campoTextoMarca;
    private javax.swing.JTextField campoTextoModelo;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel labelDNI;
    private javax.swing.JLabel labelDominio;
    private javax.swing.JLabel labelMarca;
    private javax.swing.JLabel labelModelo;
    private javax.swing.JComboBox tiposDeVehiculos;
    // End of variables declaration//GEN-END:variables

}// Fin clase nuevoVehiculo
